/**
 * 高阶函数（Higher-order Function）
 * 接受一个或多个函数作为输入（参数）
 * 输出（返回值）是一个函数
 */

#include <functional>
#include <iostream>
#include <map>
using namespace std;
int add(int a, int b) {return a + b;}

class Foo{
public:
    void operator()(int num){
        std::cout << "Foo::operator(): " << num << std::endl;
    }
};

class BaseClass 
{
public:
    void forEachData(std::function<void(const std::string&, int)> callback)
    {
        for (const auto& pair : m_DataMap) {
            callback(pair.first, pair.second);
        }
    }
private:
    std::map<std::string, int> m_DataMap;
};
void printData(const std::string& key, int value) {
    std::cout << "Key: " << key << ", Value: " << value << std::endl;
}

 int main()
 {
    std::function<int(int, int)> f = add;
    int result = f(2, 3);
    std::cout << result << std::endl;  // 输出：5

    std::function<int(int, int)> func = [](int a, int b) {return a - b;};
    result = func(2, 3);
    std::cout << result << std::endl;


    //函数对象，也叫仿函数，是一个重载了operator()的类的对象。
    //对于这样的函数对象，我们也可以将其赋给std::function
    Foo foo;
    std::function<void(int)> func1 = foo;
    func1(10);  // 输出：Foo::operator(): 10

    //回调
    BaseClass base;
    base.forEachData(printData);
 }